10509. Обмануть Мистера Фреймана
Мистер Фрейман – известный
музыкант, учитель и Нобелевский лауреат. Однажды он в уме смог вычислить
значение кубического корня из числа 1729.03 до трех знаков после запятой,
получив 12.002.
Приближенно
вычислить квадратный корень можно следующим образом. Пусть = a + dx,
где a – целое, 0 £ dx < 1. Тогда n = (a + dx)2
= a2 + 2 * a * dx + (dx)2.
Если значение dx мало, то при приближенном вычислении слагаемое (dx)2
можно не учитывать, то есть можно положить что n = a2
+ 2 * a * dx. Здесь dx = (n – a2)
/ 2a. В задаче требуется построить аналогичную схему для вычисления
приближенного значения кубического корня.
Вход.
Каждая строка содержит действительное значение n в промежутке от 0 до
1000000 включительно. Последняя строка содержит 0 и не обрабатывается.
Выход. Для каждого теста вывести
приближенное значение , округленное до четырех цифр после десятичной точки.
1729.0300
64.0000
63.9990
0
Пример выхода
12.0024
4.0000
4.3703
математика
Если = a + dx,
то n = (a + dx)3 = a3 + 3 * a2
* dx + 3 * a * (dx)2 + (dx)3.
Если отбросить второе и третье слагаемое в правой части, то приближенно имеем
равенство n = a3 + 3 * a2 * dx.
Отсюда dx = (n – a3) / 3a2.
При этом a = .
В первом тесте n = 1729.03, значит a = . = 12. dx = (1729.03 – 123) / (3 * 122)
= (1729.03 – 1728) / 432 = 1.03 / 432 = 0.0001 * 10300 / 432 = 0.0024. Откуда = a + dx
= 12 + 0.0024 = 12.0024.
Читаем входное значение n,
вычисляем a = = = . Последнее выражение на языке С запишется как (int)(exp(log(n)/3) + 0.0000001). Перед взятием целой
части следует добавить к exp(log(n)/3)
некое малое значение eps = 0.0000001, чтобы избежать ошибки округления.
Находим значение dx и выводим a + dx с четырьмя знаками
после десятичной точки.
while(scanf("%lf",&n),n)
{
a = (int)(exp(log(n)/3)
+ 0.0000001);
dx = (n - a * a * a) / (3 * a * a);
printf("%.4lf\n",a+dx);
}